package tum0r.webengine.models.core

import tum0r.webengine.config.SessionConfig
import tum0r.webengine.extension.addMillionSeconds
import java.util.*

/**
 * 说明: 服务器Session数据类
 *
 * 创建者: tum0r
 *
 * 时间: 2021/8/21 16:46
 *
 * @param[ID] Session的ID，应为唯一
 * @param[arguments] 此Session中保存的数据
 * @param[createTime] Session创建时间
 * @param[lastAccessTime] 上次更新Session的时间
 */
data class Session(val ID: String, val arguments: LinkedHashMap<String, Any?>, var createTime: Date, var lastAccessTime: Date) {
    /**
     * 初始化默认的Session对象
     */
    constructor() : this("${SessionConfig.SESSION_PREFIX}${UUID.randomUUID().toString().replace("-", "")}", LinkedHashMap(), Date(), Date())

    /**
     * 获取Session中保存的数据
     *
     * @param[key] 数据的索引键
     * @param[default] 当找不到键对应的值时返回的默认值
     */
    fun getArgument(key: String, default: Any?): Any? = arguments.getOrDefault(key, default)

    /**
     * 获取Session中保存的数据
     *
     * @param[key] 数据的索引键
     */
    fun getArgument(key: String): Any? = getArgument(key, null)

    /**
     * 设置Session中保存的数据，若索引键已存在则会替换原来保存的数据
     *
     * @param[key] 数据的索引键
     * @param[data] 数据
     */
    fun setArgument(key: String, data: Any?) = if (!arguments.containsKey(key)) arguments.put(key, data) else arguments.replace(key, data)

    /**
     * 删除Session中保存的数据
     *
     * @param[key] 数据的索引键
     */
    fun removeArgument(key: String): Any? = arguments.remove(key)

    /**
     * 清空Session中保存的数据
     */
    fun clearArgument() = arguments.clear()

    /**
     * 此session是否过期
     *
     * @return true为过期
     */
    fun isTimeOut(): Boolean = if (SessionConfig.SESSION_TIMEOUT != 0) lastAccessTime.addMillionSeconds(SessionConfig.SESSION_TIMEOUT).time < Date().time else false
}